/**
 * @file uart_protocol.h
 * @brief 串口通信协议定义
 * @version 1.0
 * @date 2023-03-15
 */

#ifndef UART_PROTOCOL_H
#define UART_PROTOCOL_H

#include <stdint.h>
#include "common_defs.h"  // 包含通用定义

#ifdef __cplusplus
extern "C" {
#endif

// 帧头定义
#define FRAME_HEADER_1 0xAA
#define FRAME_HEADER_2 0x55

// 帧尾定义
#define FRAME_FOOTER_1 0x55
#define FRAME_FOOTER_2 0xAA

// 命令类型
#define CMD_REQUEST_DATA 0x01
#define CMD_RESPONSE_DATA 0x02
#define CMD_SET_CONFIG 0x03
#define CMD_ACK 0x04
#define CMD_RESET 0x05

// 请求/响应命令
#define CMD_REQUEST "RQ"
#define CMD_RESPONSE "RP"

// 错误码
typedef enum {
    UART_OK = 0,
    UART_ERR_TIMEOUT = -1,
    UART_ERR_CHECKSUM = -2,
    UART_ERR_FRAME_FORMAT = -3,
    UART_ERR_DEVICE_ERROR = -4,
    UART_ERR_INVALID_PARAM = -5,
    UART_ERR_LENGTH = -6,
    UART_ERR_FRAME = -7,
    UART_ERR_PARAM = -8
} UARTError;

// 传感器数据包
typedef struct {
    float temperature;        // 温度(°C)
    float humidity;           // 湿度(%)
    float wind_speed;         // 风速(m/s)
    float wind_direction;     // 风向(度)
    float tension1;           // 拉力1(N)
    float tension2;           // 拉力2(N)
    float battery_level;      // 电池电量(%)
    float voltage;            // 电压(V)
    int signal_strength;      // 信号强度(dBm)
    uint64_t timestamp;       // 时间戳（毫秒）
} SensorDataPacket;

// 请求帧
typedef struct {
    uint8_t header[2];        // 帧头
    uint8_t cmd[2];           // 命令类型
    uint8_t data_length;      // 数据长度
    uint8_t data[32];         // 负载数据
    uint8_t checksum;         // 校验和
    uint8_t footer[2];        // 帧尾
} RequestFrame;

// 响应帧
typedef struct {
    uint8_t header[2];        // 帧头
    uint8_t cmd[2];           // 命令类型
    uint8_t data_length;      // 数据长度
    uint8_t data[128];        // 负载数据
    uint8_t checksum;         // 校验和
    uint8_t footer[2];        // 帧尾
} ResponseFrame;

// 帧头和帧尾常量数组
extern const uint8_t FRAME_HEADER[2];
extern const uint8_t FRAME_FOOTER[2];

/**
 * @brief 计算校验和
 * 
 * @param data 数据
 * @param length 数据长度
 * @return uint8_t 校验和
 */
uint8_t calculate_checksum(const void *data, size_t length);

/**
 * @brief 获取错误码对应的字符串描述
 * 
 * @param error_code 错误码
 * @return const char* 错误描述
 */
const char* uart_error_str(int error_code);

#ifdef __cplusplus
}
#endif

#endif /* UART_PROTOCOL_H */